#include <iostream>
#include<cstring>
#include <unistd.h>
#include <functional>
#include <vector>
#include <sys/fcntl.h>
using namespace std;
using func_t = function<void(void)>;
static vector<func_t> fcuns;

void Print()
{
    cout << "这是一个打印任务\n";
}
void MySql()
{
    cout << "这是一个数据库任务\n";
}
void Net()
{
    cout << "这是一个网络任务\n";
}
void Cal()
{
    cout << "这是一个计算器任务\n";
}

void execuFunc()
{
    fcuns.push_back(Print);
    fcuns.push_back(MySql);
    fcuns.push_back(Net);
    fcuns.push_back(Cal);
}
void Handler()
{
    for (auto &x : fcuns)
    {
        x();
    }
}
void SetNonBlock(int fd) // 设置非阻塞
{
    int f1 = fcntl(fd, F_GETFD); // 获取fd的标志
    int newFlag = f1 | O_NONBLOCK;
    fcntl(fd, F_SETFL, newFlag);
}

int main()
{
    SetNonBlock(0);
    execuFunc();
    while (1)
    {
        printf(">>>>> ");
        fflush(stdout);
        char buf[2048];
        int s = read(0, buf, sizeof(buf) - 1);
        if (s > 0)
        {
            buf[s - 1] = 0;
            cout << " [sever]# " << buf << endl;
            continue;
        }
        else if (0 == s)
        {
            cout << "file end ···\n";
            break;
        }
        else
        {
            if (errno == EAGAIN || errno == EWOULDBLOCK)
            {
                // 数据没有准备好，先忙活其他事情
                Handler();
                printf("\n");
                sleep(1);
                continue;
            }
            else if(errno==EINTR)
            {
                continue;
            }
            else
            {
                cout<<"read fail! code: "<<errno<<" "<<strerror(errno)<<endl;
                break;
            }
        }
    }
    return 0;
}